package com.lzh.runke.core.service;


import com.lzh.runke.core.entity.BaseEntity;
import com.lzh.runke.core.entity.spec.BaseSpec;
import com.lzh.runke.core.web_base.Result;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;

/**
 * @Description:
 * @Author: LiuZiHao
 * @Date: 2022/5/25 16:02
 */
public interface IBaseService<Entity extends BaseEntity, Spec extends BaseSpec> {

    /**
     * 保存（插入/更新）
     * 根据ID是否为空判断
     *
     * @param entity
     * @return
     */
    Result<Integer> save(Entity entity);

    /**
     * 插入记录
     *
     * @param entity
     * @return
     */
    Result<Integer> insert(Entity entity);

    /**
     * 批量插入记录
     *
     * @param entity
     * @return
     */
    Result<Integer> insertBatch(Collection<Entity> entity);

    /**
     * 根据entity.id更新记录，（entity.id 必须传入）
     *
     * @param entity
     * @return
     */
    Result<Integer> update(Entity entity);

    /**
     * 根据其他条件
     *
     * @param entity
     * @param spec
     * @return
     */
    Result<Integer> updateBySpec(@Param("entity") Entity entity, @Param("spec") Spec spec);

    /**
     * 根据主键删除记录
     *
     * @param entity
     * @return
     */
    Result<Integer> delete(Entity entity);

    /**
     * 根据条件删除记录
     *
     * @param spec
     * @return
     */
    Result<Integer> deleteBySpec(Spec spec);

    /**
     * 根据ID查询记录
     *
     * @param id
     * @return
     */
    Result<Entity> findById(String id);

    /**
     * 查询所有记录
     *
     * @return
     */
    Result<List<Entity>> findAll();

    /**
     * 根据条件查询记录
     *
     * @param spec
     * @return
     */
    Result<List<Entity>> findBySpec(Spec spec);

    /**
     * 根据条件查询记录并按页码分页
     *
     * @param spec 条件
     * @return
     */
    Result<List<Entity>> findBySpecForPage(Spec spec);

}
